using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Media;
using System;
using ProtoGame.RegioesGatilho;
using ProtoGame.GameLib.GameComponents;


namespace ProtoGame.Fases.Labirinto
{
    /// <summary>
    /// This is a game component that implements IUpdateable.
    /// </summary>
    public class PGLabirintoMain<TIdFase> : PGFase<TIdFase> where TIdFase : struct
    {
        const uint altura = 8;

        PGArvoreLabirinto fase;
        Song musicaFundo;

        public PGLabirintoMain(Game game)
            : base(game)
        {
            // TODO: Construct any child components here
        }

        /// <summary>
        /// Allows the game component to perform any initialization it needs to before starting
        /// to run.  This is where it can query for any required services and load content.
        /// </summary>
        public override void Initialize()
        {
            base.Initialize();
        }

        protected override void LoadContent()
        {
            fase = new PGArvoreLabirinto(altura, gatilhoDialogo_Ativou, Game);
            fase.CompletouLabirinto += new EventHandler(fase_CompletouLabirinto);
            Mapa = fase.Atual;

            musicaFundo = Game.Content.Load<Song>(@"Audio/Songs/Cave");
            MediaPlayer.Play(musicaFundo);

            base.LoadContent();
        }

        /// <summary>
        /// Allows the game component to update itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        public override void Update(GameTime gameTime)
        {
            Mapa = fase.Atual;

            base.Update(gameTime);
        }

        /*public override void Draw(GameTime gameTime)
        {
            //fase.Atual.Draw(gameTime);

            base.Draw(gameTime);
        }*/

        protected override void jogador_EnergiaAcabou(object sender, EventArgs e)
        {
            MediaPlayer.Stop();
            EstadoFase = EstadosFase.JogadorMorreu;
            OnFimFase(this, EventArgs.Empty);

            base.jogador_EnergiaAcabou(sender, e);
        }

        private void gatilhoDialogo_Ativou(object sender, EventArgs e)
        {
            PGGatilhoJogador gj = sender as PGGatilhoJogador;

            switch (gj.Id)
            {
                case 0:
                    ConversaKoboldInicio();
                    break;

                case 1:
                    ConversaKoboldsFim();
                    break;

                default:
                    throw new NotImplementedException();
            }

            gj.Alive = false;
        }

        void fase_CompletouLabirinto(object sender, EventArgs e)
        {
            MediaPlayer.Stop();
            EstadoFase = EstadosFase.FaseCompletada;
            OnFimFase(this, EventArgs.Empty);
        }

        private void ConversaKoboldsFim()
        {
            DialogBox<byte> db = Game.Services.GetService(typeof(DialogBox<byte>)) as DialogBox<byte>;
            db.AddSpeech("Kobold: \"Atalph! Nos conseguimos fugir, mas ainda ha muitos kobolds presos alem daquela passagem. Por favor! Tente salva-los!\"");
            db.AddSpeech("Kobold: \"Mas tome muito cuidado. A caverna adiante e' mal assombrada. Esses tais castursos andaram brincando com elementos misticos e agora a coisa esta' fora de controle.\"");
            db.AddSpeech("Kobold: \"Nos vamos voltar para a tribo para tentar compreender melhor a situacao e achar uma maneira de resolver a questao.\"");
            db.AddSpeech("Atalph: \"Certo! Eu marquei o caminho de saida com essas placas. Sempre que o numero aumentar, voces estao no caminho certo. Senao, voltem e procurem por outro caminho. Ate' logo!\"");
            db.WakeUp();

            EstadoFase = EstadosFase.Pausado;
        }

        private void ConversaKoboldInicio()
        {
            DialogBox<byte> db = Game.Services.GetService(typeof(DialogBox<byte>)) as DialogBox<byte>;
            db.AddSpeech("Kobold: \"Atalph! Finalmente alguem nos encontrou! Eu consegui me livrar mas os outros ainda estao presos no fim desta caverna.\"");
            db.AddSpeech("Kobold: \"Tive sorte de conseguir achar o caminho certo, pois e' um labirinto bem grande!.\"");
            db.AddSpeech("Kobold: \"Tome essas placas de marcacao que estava preparando. Encontre o caminho correto e use as placas para marcar o caminho de volta para os outros e para voce mesmo.\"");
            db.AddSpeech("Jogador, use a tecla 'ESPACO' para posicionar uma placa marcadora aos pes de Atalph. Nao se esqueca do tempo e boa sorte!");
            db.WakeUp();

            EstadoFase = EstadosFase.Pausado;
        }
    }
}